﻿using B2B.Bussiness;
using B2B.ServiceReference1;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Navigation;

namespace B2B.Views
{
    public partial class Home : Page
    {
        ServiceReference1.DataServiceClient client = new ServiceReference1.DataServiceClient();
        Kullanici usr = Session.Instance.GetValue<Kullanici>("USER");
        List<FiyatListesi> FiyatListesi = new List<FiyatListesi>();
        Dictionary<string, TreeViewItem> Kategoriler = new Dictionary<string, TreeViewItem>();
        List<Order> Lines = new List<Order>();
        double usdKur = Session.Instance.GetValue<double>("USD");
        double euroKur = Session.Instance.GetValue<double>("EURO");

        public Home()
        {
            InitializeComponent();
            this.Loaded += Home_Loaded;
            this.txtStokKodu.KeyDown += txtStokKodu_KeyDown;
        }

        void txtStokKodu_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (!string.IsNullOrEmpty(txtStokKodu.Text))
                {
                    bsyIndic.IsBusy = true;
                    client.UrunListeAsync(txtStokKodu.Text, 5);
                }
                else
                {
                    MessageBox.Show("Lütfen aramak için bir kriter giriniz !");
                }
            }
        }

        void Home_Loaded(object sender, RoutedEventArgs e)
        {
            if (usr != null)
            {
                txtDoviz.Text = "USD " + Session.Instance.GetValue<double>("USD").ToString("n2") + "  EURO " + Session.Instance.GetValue<double>("EURO").ToString("n2");
                client.FirmaBulAsync(usr.FirmaKodu);
                client.FirmaBulCompleted += client_FirmaBulCompleted;
                client.KategoriListesiAsync();
                client.KategoriListesiCompleted += client_KategoriListesiCompleted;
                client.AltGrupListesiCompleted += client_AltGrupListesiCompleted;
                client.FavoriyeEkleCompleted += (ss, oo) =>
                {
                    bsyIndic.IsBusy = false;
                    if (oo.Result)
                    {
                        MessageBox.Show("Favoriye Eklendi !");
                    }
                    else
                    {
                        MessageBox.Show("Zaten daha önce eklenmiş !");
                    }
                };

                client.FavoridenSilCompleted += (ss, oo) =>
                {
                    bsyIndic.IsBusy = false;
                    if (oo.Result)
                    {
                        MessageBox.Show("Favorilerden çıkarıldı !");
                    }
                    else
                    {
                        MessageBox.Show("Kayıtlı değil !");
                    }
                };

                client.UrunListeCompleted += client_UrunListeCompleted;
            }
        }

        void client_AltGrupListesiCompleted(object sender, AltGrupListesiCompletedEventArgs e)
        {
            foreach (var item in e.Result)
            {
                TreeViewItem node = KategoriBul(item.Kodu);
                if (node != null)
                {
                    TreeViewItem ch = new TreeViewItem();
                    ch.Header = item.Adi + " (" + item.StokSayisi.ToString() + ")";
                    ch.Tag = item.Kodu;
                    node.Items.Add(ch);
                }
            }
            bsyIndic.IsBusy = false;
        }

        private TreeViewItem KategoriBul(string kodu)
        {
            string ktg = kodu.Substring(0, kodu.IndexOf('.'));
            if (Kategoriler.ContainsKey(ktg))
            {
                return Kategoriler[ktg];
            }
            return null;
        }

        void client_KategoriListesiCompleted(object sender, KategoriListesiCompletedEventArgs e)
        {
            foreach (var item in e.Result)
            {
                TreeViewItem node = new TreeViewItem();
                node.Header = item.Adi + " (" + item.StokSayisi.ToString() + ")";
                node.Tag = item.Kodu;
                Kategoriler.Add(item.Kodu, node);
                treeKategori.Items.Add(node);
            }
            client.AltGrupListesiAsync();
        }

        void client_UrunListeCompleted(object sender, UrunListeCompletedEventArgs e)
        {
            List<Urun> urunler = new List<Urun>();
            foreach (var item in e.Result)
            {
                Urun urn = new Urun();
                urn.Adi = item.Adi;
                urn.DovizCinsi = item.DovizCinsi;

                if (item.DovizCinsi == 1)
                    urn.Doviz = "USD";
                else if (item.DovizCinsi == 2)
                    urn.Doviz = "EU";
                else
                    urn.Doviz = "TL";

                urn.ID = item.ID;
                urn.KategoriKodu = item.KategoriKodu;
                urn.KdvID = item.KdvID;
                urn.KdvOrani = item.KdvOrani;
                urn.Kodu = item.Kodu;
                urn.Resim = item.Resim;
                urn.Miktar = 1;
                var fytliste = FiyatListesi.Where(x => x.StokKodu == item.Kodu).FirstOrDefault();
                if (fytliste != null)
                {
                    if (fytliste.DovizCinsi == 1)
                        urn.Doviz = "USD";
                    else if (fytliste.DovizCinsi == 2)
                        urn.Doviz = "EU";
                    else
                        urn.Doviz = "TL";

                    urn.DovizCinsi = fytliste.DovizCinsi;
                    if (fytliste.Isk1Oran > 0)
                        urn.Iskonto = fytliste.Isk1Oran.ToString() + ",";
                    if (fytliste.Isk2Oran > 0)
                        urn.Iskonto += fytliste.Isk2Oran.ToString() + ",";
                    if (fytliste.Isk3Oran > 0)
                        urn.Iskonto += fytliste.Isk3Oran.ToString() + ",";
                    if (fytliste.Isk4Oran > 0)
                        urn.Iskonto += fytliste.Isk4Oran.ToString() + ",";
                    if (fytliste.Isk5Oran > 0)
                        urn.Iskonto += fytliste.Isk5Oran.ToString() + ",";
                    if (fytliste.Isk6Oran > 0)
                        urn.Iskonto += fytliste.Isk6Oran.ToString() + ",";

                    if (!string.IsNullOrEmpty(urn.Iskonto) && urn.Iskonto.IndexOf(',') > -1)
                        urn.Iskonto = urn.Iskonto.Substring(0, urn.Iskonto.Length - 1);

                    urn.Fiyat = Math.Round(fytliste.BrutFiyat, 2);
                    urn.FiyatListe = fytliste;
                }
                else
                {
                    urn.Fiyat = Math.Round(item.Fiyat, 2);
                    urn.Iskonto = "";
                }

                urunler.Add(urn);
            }
            PagedCollectionView view = new PagedCollectionView(urunler);
            grdData.ItemsSource = view;
            PagerGrid.Source = view;
            bsyIndic.IsBusy = false;
        }

        void client_FirmaBulCompleted(object sender, FirmaBulCompletedEventArgs e)
        {
            if (e.Result != null)
            {
                Session.Instance.Add("FIRMA", e.Result);
                string kullanici = usr.Adi + " " + usr.Soyadi;
                txtFirma.Text = e.Result.Adi.Substring(0, 44 - kullanici.Length) + "-" + kullanici;
                client.CariFiyatListesiAsync(e.Result.Kodu);
                client.CariFiyatListesiCompleted += client_CariFiyatListesiCompleted;
                AnlasmaliUrunListesi();
            }
        }

        void client_CariFiyatListesiCompleted(object sender, CariFiyatListesiCompletedEventArgs e)
        {
            FiyatListesi.AddRange(e.Result.ToArray());
        }

        // Executes when the user navigates to this page.
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }

        private void SipariseEkle(object sender, RoutedEventArgs e)
        {
            if (!usr.SiparisVerebilir)
            {
                MessageBox.Show("Sipariş verme yetkiniz bulunmamaktadır !");
                return;
            }
            var ctl = e.OriginalSource as Button;
            if (null != ctl)
            {
                var product = ctl.DataContext as Urun;
                if (null != product)
                {
                    double kur = 1;
                    if (product.DovizCinsi == 1)
                        kur = usdKur;
                    else if (product.DovizCinsi == 2)
                        kur = euroKur;

                    Order spr = Lines.Where(x => x.Kodu == product.Kodu).FirstOrDefault();
                    if (spr != null)
                    {
                        spr.Miktar += product.Miktar;
                        spr.Yekun = Math.Round(spr.Fiyat * spr.Miktar, 2);
                        spr.KdvTutari = Math.Round(((spr.Yekun - (spr.Iskonto1 + spr.Iskonto2 + spr.Iskonto3 + spr.Iskonto4 + spr.Iskonto5 + spr.Iskonto6)) * spr.KdvOrani / 100d), 2);
                    }
                    else
                    {
                        bool kaydet = true;
                        if (!usr.ListeDisiAlabilir)
                        {
                            if (product.FiyatListe == null)
                                kaydet = false;
                        }

                        if (kaydet)
                        {
                            Cari cr = Session.Instance.GetValue<Cari>("FIRMA");
                            spr = new Order();
                            spr.CariKodu = cr.Kodu;
                            spr.KullaniciID = usr.ID;
                            spr.Adi = product.Adi;
                            spr.Fiyat = product.Fiyat * kur;
                            spr.Kodu = product.Kodu;
                            spr.StokKodu = product.Kodu;

                            if (product.FiyatListe != null)
                            {
                                spr.Iskonto1 = product.FiyatListe.Isk1Tutar * kur;
                                spr.Iskonto2 = product.FiyatListe.Isk2Tutar * kur;
                                spr.Iskonto3 = product.FiyatListe.Isk3Tutar * kur;
                                spr.Iskonto4 = product.FiyatListe.Isk4Tutar * kur;
                                spr.Iskonto5 = product.FiyatListe.Isk5Tutar * kur;
                                spr.Iskonto6 = product.FiyatListe.Isk6Tutar * kur;
                            }
                            spr.KdvID = product.KdvID;
                            spr.KdvOrani = product.KdvOrani;
                            spr.Miktar = product.Miktar;
                            spr.Onaylandi = false;
                            spr.Yekun = Math.Round(spr.Miktar * spr.Fiyat, 2);
                            spr.KdvTutari = Math.Round(((spr.Yekun - (spr.Iskonto1 + spr.Iskonto2 + spr.Iskonto3 + spr.Iskonto4 + spr.Iskonto5 + spr.Iskonto6)) * spr.KdvOrani / 100d), 2);
                            Lines.Add(spr);
                        }
                        else
                        {
                            MessageBox.Show("Anlaşma yapılmayan ürünler eklenemez !");
                        }
                    }
                }
            }
        }

        private void ResmiBuyut(object sender, MouseEventArgs e)
        {
            var ctl = e.OriginalSource as Image;
            if (null != ctl)
            {
                var product = ctl.DataContext as Urun;
                if (null != product)
                {
                    ProductImage img = new ProductImage();
                    img.Image = new B2B.Extensions.ByteToImageConverter().ConvertByteArrayToBitMapImage(product.Resim);
                    img.Show();
                }
            }
        }

        private void favoriyeEkle(object sender, MouseEventArgs e)
        {
            var ctl = e.OriginalSource as Image;
            if (null != ctl)
            {
                var product = ctl.DataContext as Urun;
                if (null != product)
                {
                    client.FavoriyeEkleAsync(usr.ID, product.ID);
                }
            }
        }

        private void favoridenSil(object sender, MouseEventArgs e)
        {
            var ctl = e.OriginalSource as Image;
            if (null != ctl)
            {
                var product = ctl.DataContext as Urun;
                if (null != product)
                {
                    client.FavoridenSilAsync(usr.ID, product.ID);
                }
            }
        }

        private void SiparisTamamla(object sender, RoutedEventArgs e)
        {
            SiparisSonuc son = new SiparisSonuc();
            son.SiparisListe = Lines;
            son.Show();
        }

        private void FavoriListem(object sender, RoutedEventArgs e)
        {
            bsyIndic.IsBusy = true;
            client.UrunListeAsync(usr.ID.ToString(), 3);
        }

        private void AnlasmaliUrunlerim(object sender, RoutedEventArgs e)
        {
            AnlasmaliUrunListesi();
        }

        private void AnlasmaliUrunListesi()
        {
            bsyIndic.IsBusy = true;
            Cari frm = Session.Instance.GetValue<Cari>("FIRMA");
            client.UrunListeAsync(frm.Kodu, 4);
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            bsyIndic.IsBusy = true;
            client.UrunListeAsync(txtStokKodu.Text, 5);
        }

        private void btnCikis_Click(object sender, RoutedEventArgs e)
        {
            Session.Instance.Delete("USER");
            this.NavigationService.Navigate(new Uri("/Login", UriKind.Relative));
        }

        private void treeKategori_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            bsyIndic.IsBusy = true;
            TreeViewItem item = (TreeViewItem)((TreeView)sender).SelectedItem;
            if (item != null)
            {
                client.UrunListeAsync(item.Tag.ToString(), 2);
            }
        }
    }
}
